package xyz.ssf.cloud.common.core.storage;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.UUID;

/**
 * 文件服务
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class FileService {
    
    private final StorageFactory storageFactory;
    
    /**
     * 上传文件
     *
     * @param file 文件
     * @param path 存储路径
     * @return 文件访问URL
     */
    public String uploadFile(MultipartFile file, String path) throws Exception {
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("上传文件不能为空");
        }
        
        // 获取原文件名
        String originalFilename = file.getOriginalFilename();
        if (StringUtils.isBlank(originalFilename)) {
            originalFilename = "file.tmp";
        }
        
        // 处理文件名
        String extension = FilenameUtils.getExtension(originalFilename);
        String filename = generateFileName(extension);
        
        // 获取存储策略
        StorageStrategy strategy = storageFactory.getStorageStrategy();
        
        // 生成日期目录
        path = generateDatePath(path);
        
        // 上传文件
        return strategy.uploadFile(file, path, filename);
    }
    
    /**
     * 上传文件
     *
     * @param inputStream 文件流
     * @param extension   文件扩展名
     * @param path        存储路径
     * @return 文件访问URL
     */
    public String uploadFile(InputStream inputStream, String extension, String path) throws Exception {
        if (inputStream == null) {
            throw new IllegalArgumentException("上传文件流不能为空");
        }
        
        // 处理文件名
        String filename = generateFileName(extension);
        
        // 获取存储策略
        StorageStrategy strategy = storageFactory.getStorageStrategy();
        
        // 生成日期目录
        path = generateDatePath(path);
        
        // 上传文件
        return strategy.uploadFile(inputStream, path, filename);
    }
    
    /**
     * 删除文件
     *
     * @param fileUrl 文件URL
     * @return 是否删除成功
     */
    public boolean deleteFile(String fileUrl) {
        if (StringUtils.isBlank(fileUrl)) {
            return false;
        }
        
        try {
            // 获取存储策略
            StorageStrategy strategy = storageFactory.getStorageStrategy();
            
            // 删除文件
            return strategy.deleteFile(fileUrl);
        } catch (Exception e) {
            log.error("删除文件失败: {}", e.getMessage(), e);
            return false;
        }
    }
    
    /**
     * 获取所有可用的存储类型
     */
    public Map<String, String> getAvailableTypes() {
        return storageFactory.getAvailableTypes();
    }
    
    /**
     * 生成文件名
     * 使用UUID生成唯一文件名
     */
    private String generateFileName(String extension) {
        String uuid = UUID.randomUUID().toString().replace("-", "");
        if (StringUtils.isNotBlank(extension)) {
            return uuid + "." + extension;
        }
        return uuid;
    }
    
    /**
     * 生成日期路径
     * 按年/月/日的格式生成目录
     */
    private String generateDatePath(String basePath) {
        // 按照年月日格式生成文件存储目录
        String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        
        if (StringUtils.isNotBlank(basePath)) {
            if (basePath.endsWith("/")) {
                return basePath + datePath;
            } else {
                return basePath + "/" + datePath;
            }
        }
        
        return datePath;
    }
    
    /**
     * 获取当前存储策略类型
     */
    public String getCurrentStorageType() {
        return storageFactory.getStorageStrategy().getType();
    }
} 